<?php

/*
Aurus CMS - free OOP CMS
Copyright (C) 2010  Nestor Yanchuk

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
if (! defined ( 'ROOT' ))
die ();

/**
 * Return an array of files and folders
 *
 * @param string $path - path to folder
 * @param bool $onlydirs - detect only files
 * @param bool $onlyfiles - detect only directories
 * @param string $ext - file extension work if only $onlyfiles=true
 * @param bool $hide_dot_files - hide files whitch start with "."
 * @return array
 */
function read_directory($path, $onlydirs = false, $onlyfiles = false, $ext = null, $hide_dot_files = true, $recursive = false, $parent = '') {
	$recursiveDirs = array();
	$ret = array();
	if (!$path) {
		return array();
	}
	$path = rtrim($path, '\\/') . '/';
	if ($parent) {
		$parent = rtrim($parent, '\\/') . '/';
		$parent = str_replace($parent, '', $path);
	}

	$dh = opendir($path);
	if (!$dh) {
		return array();
	}

	if (is_array($ext)) {
		foreach ($ext as &$value) {
			$value = trim($value, '.');
		}
	} elseif (is_string($ext)) {
		$ext = array(trim($ext, '.'));
	}

	while (!is_bool($file = readdir($dh))) {
		if ($file == '.' || $file == '..' || ($hide_dot_files && $file[0] == '.') ) {
			continue;
		}

		if (is_dir($path . $file)) {
			if (!$onlyfiles) {
				$ret[] = $parent . $file;
			}
			if ($recursive) {
				$recursiveDirs[] = $path . $file;
			}
		} else {
			if (!$onlydirs) {
				if ($ext !== null) {
					$fileExt = explode('.', $file);
					$fileExt = end($fileExt);

					if (in_array($fileExt, $ext)) {
						$ret[] = $parent . $file;
					}
				} else {
					$ret[] = $parent . $file;
				}
			}
		}
	}
	closedir($dh);

	if ($recursive && sizeof($recursiveDirs)) {
		foreach ($recursiveDirs as $dir) {
			$ret = array_merge($ret, read_directory($dir, $onlydirs, $onlyfiles, $ext, $hide_dot_files, $recursive, $path));

		}
	}

	return $ret;
}

/**
 * Примінення функції trim до всіх елементів масиву
 *
 * @param array $array
 * @return array
 */
function trimArray($array) {
	return array_map ( 'trim', $array );
}

/**
 * Нормальний вид розміру файлу, читати розмір в бітах доволі тяжко
 *
 * @param int $data
 * @return string
 */
function formatFileSize($data) {
	if ($data < 1024) {
		return $data . " bytes";
	} elseif ($data < 1024000) {
		return round ( ($data / 1024), 2 ) . "kb";
	} else {
		return round ( ($data / 1024000), 2 ) . " MB";
	}
}

/**
 * Створення асоціативного масиву із звичайного
 *
 * @param array $array
 * @return array
 */
function makeAssociativeArray($array) {
	if (! $array or ! count ( $array )) {
		return array ();
	}
	foreach ( $array as $k => $val ) {
		$ret [$val] = $val;
	}
	return $ret;
}

/**
 * Перевірка чи значення правдиве чи хибне, стандартні функції не підходять, бо строка "no" буде як true
 *
 * @param mixed $d - Значення яке треба провірити
 * @return bool
 */
function boolean($d) {
	if (is_bool ( $d )) {
		return $d;
	}
	switch ($d) {
		case 'true' :
		case 'yes' :
		case 'on' :
		case '1' :
			return true;
			break;
		case 'false' :
		case 'no' :
		case 'off' :
		case '0' :
			return false;
			break;
	}
	if (is_null ( $d )) {
		return false;
	}
	if (is_float ( $d ) or is_int ( $d )) {
		return ( bool ) $d;
	}

	return false;
}

/**
 * Форматування дати згідно до налаштуваннь скрипту
 *
 * @param unknown_type $timeFormat
 * @param unknown_type $timestamp
 * @return unknown
 */
function au_date($timeFormat, $timestamp = TIME) {
	$timestamp += Config::get ( 'timeCorrection' ) * 3600;
	return strtr ( date ( $timeFormat, $timestamp ), Lang::getTimeLng () );
}

/**
 * Функція для відкладки скрипту
 */
function debug($data, $var_dump = false) {
	print '<pre>';
	if (is_array ( $data ) && ! $var_dump) {
		echo str_replace ( '<', '&lt;', print_r ( $data, 1 ) );
	} else {
		ob_start ();
		var_dump ( $data );
		echo str_replace ( '<', '&lt;', ob_get_clean () );
	}
	print '</pre>';
}

/**
 * Функція повертає виставлені права на файл
 */
function getPerms($file_path) {
	return @decoct ( @fileperms ( $file_path ) ) % 1000;
}

/**
 * Провірка чи поштова скринька введена вірно
 */
function isValidEmail($email) {
	return boolean ( preg_match ( "~[A-Za-z0-9\._-]+@[A-Za-z0-9\._-]+\.[A-Za-z]{2,4}~i", $email ) );
}

/**
 * Функція повертає ресурс на картинку
 */
function loadImageByType($im) {
	$type = getimagesize ( $im );
	switch ($type ['2']) {
		case IMAGETYPE_GIF :
			return imagecreatefromgif ( $im );
		case IMAGETYPE_JPEG :
			return imagecreatefromjpeg ( $im );
		case IMAGETYPE_PNG :
			return imagecreatefrompng ( $im );
		default :
			die ( $im . ' is not an image' );
	}
}

/**
 * Приведення змінної до числового типу
 */
function toInt(&$str) {
	$str = ( int ) $str;
	return $str;
}

/**
 * Форматування строки з динамічними даними з статичної строки
 * Формат строки - "строка з динамічними даними - {%1%},{%2%},{%3%}"
 * Динамічні дані відповідно підставляються з переданих аргументів.Аргументи нумеруються з нуля.Підставляються з одинички.
 *
 * @param оригінальна строка $str
 * @return string - згенерована строка
 */
function format($str) {
	$farg = func_get_args ();
	$fnar = func_num_args ();

	for($i = 1; $i < $fnar; $i ++) {
		$str = str_replace ( '{%' . $i . '%}', $farg [$i], $str );
	}

	return $str;
}

/**
 * Повертає розширення файлу
 */
function getExtention($file) {
	$e = explode ( '.', $file );
	return end ( $e );
}

/**
 * Повертає доменне ім'я сайту
 *
 * @param string $www
 * @return string
 */
function getHost($www) {
	$url = parse_url ( $www );

	if (substr ( $url ['host'], 0, 4 ) == 'www.') {
		$url ['host'] = substr ( $url ['host'], 4 );
	}
	return $url ['host'];
}

/**
 * Функція чистить масив від пустих елементів
 *
 * @param array $array
 * @return array
 */
function array_clean(&$array) {
	for($i = 0, $n = count ( $array ); $i < $n; $i ++) {
		if (! $array [$i])
		unset ( $array [$i] );
	}
}

function filter($var, $filterName) {
	return Filter::apply ( $var, $filterName );
}

function md5_array($array) {
	return md5 ( serialize ( $array ) );
}

function callback_to_string($func) {
	if (is_string ( $func )) {
		return $func;
	} else if (is_string ( $func [0] )) {
		return implode ( '::', $func );
	} else if (is_object ( $func [0] )) {
		return get_class ( $func [0] ) . '::' . $func [1];
	}
	return ( string ) $func;
}

function error($errorStr, $errLevel = E_WARNING, $file = '', $line = 0) {
	Aurus::getInstance()->setError(__('Сталась помилка: ') .'['.$errLevel.'] '.$errorStr);
	Controller::getInstance()->end();
	Log::writeLog($errorStr , $errLevel , $file, $line);
	exit($errLevel);
}

/**
 * Set cookie
 *
 * @param string $name
 * @param string $data
 * @param int $expires
 */
function set_cookie($name, $data, $expires = null) {
	if ($expires == - 1) {
		$expires = TIME - 86400;
	} elseif ($expires < 50) {
		$expires = $expires * 86400;
	}
	setcookie ( $name, $data, $expires, '/' );
}